perm filename PIXSAI.SAI[S,HE]1 blob
sn#557487 filedate 1982-05-09 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00018 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00004 00002 entry pixdim,pfldim,OPNPFL,CREPFL,getpfl,getpfd,putpfl,campix,CLPADJ,makpix,MAKDIM
C00008 00003 incremental file reading and writing routine pointers
C00009 00004 INTERNAL INTEGER PROCEDURE OPNPFL(STRING PFL REFERENCE INTEGER PC)
C00014 00005 INTERNAL INTEGER PROCEDURE CREPFL(REFERENCE INTEGER PICTURE STRING FILNAM
C00017 00006 INTERNAL PROCEDURE PFLIN(INTEGER CH REFERENCE INTEGER AR INTEGER NWDS)
C00018 00007 INTERNAL PROCEDURE PFLOUT(INTEGER CH REFERENCE INTEGER AR INTEGER NWDS)
C00020 00008 INTERNAL PROCEDURE PFLCLS(INTEGER CH)
C00021 00009 INTERNAL INTEGER PROCEDURE PFLDIM(STRING FILNAM)
C00024 00010 INTERNAL INTEGER PROCEDURE GETPFP(STRING FILNAM REFERENCE INTEGER PICTURE
C00031 00011 internal INTEGER PROCEDURE GETPFD(STRING FILNAM REFERENCE INTEGER PICTURE)
C00035 00012 internal INTEGER PROCEDURE GETPFL(STRING FILNAM REFERENCE INTEGER PICTURE)
C00041 00013 internal INTEGER PROCEDURE PIXDIM(INTEGER HEIGHT,WIDTH,BITS)
C00045 00014 internal INTEGER PROCEDURE PUTPFL(REFERENCE INTEGER PICTURE STRING FILNAM
C00050 00015 internal INTEGER PROCEDURE diminterest(REFERENCE INTEGER PICTURE INTEGER IW)
C00052 00016 INTERNAL PROCEDURE ENHANCE(REFERENCE INTEGER PIC)
C00053 00017 INTERNAL PROCEDURE SYNCHRONIZE(REFERENCE INTEGER PIC)
C00055 00018 All gone now...just like the digitizer
C00064 ENDMK
C⊗;
entry pixdim,pfldim,OPNPFL,CREPFL,getpfl,getpfd,putpfl,campix,CLPADJ,makpix,MAKDIM;
entry normalize, synchronize,diminterest,interest,PFLIN,PFLOUT,PFLCLS;
begin
REQUIRE "FILHDR.SAI[VIS,HPM]" SOURCE_FILE;
DEFINE PCLN=0; comment index of word in a picture file containing
number of scanlines in the picture;
DEFINE PCWD=1; comment number of words in the picture;
DEFINE PCBY=2; comment number of valid bytes in the picture;
DEFINE PCBYA=3; comment no. of bytes including the nulls at the end of lines;
DEFINE LNWD=4; comment no. of words per scanline;
DEFINE LNBY=5; comment no. of valid bytes per scanline;
DEFINE LNBYA=6; comment no. of bytes per scanline, including the nulls;
DEFINE WDBY=7; comment no. of bytes per word;
DEFINE WDBI=8; comment no. of bits containing data in a word;
DEFINE BYBI=9; comment no. of bits per byte;
DEFINE BMAX=10; comment largest value of a byte;
DEFINE BPTAB=11; comment address of second entry in byte pntr. table;
DEFINE LINTAB=12; comment actual address of the first entry in the row table;
EXTERNAL PROCEDURE MAKTAB(REFERENCE INTEGER PICTURE);
EXTERNAL INTEGER PROCEDURE INTOP(REFERENCE INTEGER PICTURE;
INTEGER WINSIZ;
REFERENCE INTEGER RESULTARRY;
INTEGER YEDGE(0),XEDGE(0));
EXTERNAL PROCEDURE GETPAR(REFERENCE INTEGER ARRY, PICTR);
EXTERNAL PROCEDURE PERBIT(REFERENCE INTEGER PICTURE, PERMUTATION);
EXTERNAL PROCEDURE HISTOG(REFERENCE INTEGER PICTURE, HISTOGRAM);
EXTERNAL PROCEDURE ROWSUM(REFERENCE INTEGER PICTURE, RWSUM);
EXTERNAL PROCEDURE ROWSUD(REFERENCE INTEGER PICTURE, RWSUM);
EXTERNAL INTEGER PROCEDURE CMPPAR(REFERENCE INTEGER PIC1,PIC2);
EXTERNAL PROCEDURE CLEAN(REFERENCE INTEGER PICTURE);
EXTERNAL PROCEDURE PASSHI(REFERENCE INTEGER PICTURE1;
INTEGER WINSIZ;
REFERENCE INTEGER PICTURE2);
EXTERNAL PROCEDURE HAFPIC(REFERENCE INTEGER PICTURE1,PICTURE2; INTEGER MAXBIT);
EXTERNAL INTEGER PROCEDURE MATCH(REFERENCE INTEGER PIC1,SY1,SX1,SY2,SX2;
REFERENCE INTEGER PIC2,DY1,DX1,DY2,DX2);
EXTERNAL PROCEDURE UNPACK(REFERENCE INTEGER SOURCEARRAY, PICTURE);
EXTERNAL PROCEDURE SELECT(REFERENCE INTEGER PICT1; INTEGER YEDGE,XEDGE;
REFERENCE INTEGER PICT2);
comment incremental file reading and writing routine pointers;
OWN INTEGER ARRAY PTYP,BITW,BITN,PREV,BUFP[0:'17],LBU[0:'17,1:36];
comment position markers for data-compressed files;
INTERNAL INTEGER PROCEDURE OPNPFL(STRING PFL; REFERENCE INTEGER PC);
comment Open a picture file for reading. Next PFLRD will
get beginning of first scanline in picture. PC[0:10] contains
the picture parameters if successful. Function returns channel
number on which file is open;
BEGIN
OWN INTEGER COUNT,BRCHAR,EOF,CH; BOOLEAN FLAG;
INTEGER I,J,K; INTEGER ARRAY BUF[0:20];
CH←GETCHAN; PRSFIL(PFL); EOF←TRUE;
OPEN(CH,DEVPRS,'10,19,0,COUNT,BRCHAR,EOF);
IF ¬EOF THEN LOOKUP(CH,FILPRS,FLAG);
IF FLAG ∨ EOF THEN
BEGIN
RELEASE(CH);
RETURN(-1);
END;
ARRYIN(CH,BUF[0],10);
IF BUF[0]=-1∨BUF[0]=-2∨BUF[0]=128 THEN
BEGIN "new HE (or MIT) format or data compressed format, or CMU format"
ARRYIN(CH,BUF[10],9);
I←'200;
comment in case file is MIT pseudo stanford format, and has no pointers;
IF BUF[0]≠128 THEN FOR K←18,17,16,15,10,9,8,7 DO IF BUF[K]≠0 THEN I←BUF[K];
MEMORY[LOCATION(PC)+BYBI]←BUF[1];
MEMORY[LOCATION(PC)+BMAX]←(1 LSH MEMORY[LOCATION(PC)+BYBI])-1;
MEMORY[LOCATION(PC)+LNBY]←IF BUF[0]=128 THEN BUF[2] ELSE BUF[6]-BUF[5]+1;
MEMORY[LOCATION(PC)+PCLN]←IF BUF[0]=128 THEN BUF[4]%BUF[3] ELSE BUF[4]-BUF[3]+1;
MEMORY[LOCATION(PC)+WDBY]←36%MEMORY[LOCATION(PC)+BYBI];
MEMORY[LOCATION(PC)+LNWD]←IF BUF[0]=128 THEN BUF[3] ELSE BUF[2];
MEMORY[LOCATION(PC)+LNBYA]←MEMORY[LOCATION(PC)+LNWD]*MEMORY[LOCATION(PC)+WDBY];
MEMORY[LOCATION(PC)+PCWD]←MEMORY[LOCATION(PC)+PCLN]*MEMORY[LOCATION(PC)+LNWD];
MEMORY[LOCATION(PC)+PCBY]←MEMORY[LOCATION(PC)+PCLN]*MEMORY[LOCATION(PC)+LNBY];
MEMORY[LOCATION(PC)+PCBYA]←MEMORY[LOCATION(PC)+PCLN]*MEMORY[LOCATION(PC)+LNBYA];
MEMORY[LOCATION(PC)+WDBI]←MEMORY[LOCATION(PC)+WDBY]*MEMORY[LOCATION(PC)+BYBI];
I←(I LAND '777777);
FOR J←I-1 STEP -1 UNTIL 19 DO WORDIN(CH); comment skip to first scanline;
PTYP[CH]←BUF[0]; BITN[CH]←1; PREV[CH]←0;
END
ELSE
BEGIN comment if old hand eye format;
MEMORY[LOCATION(PC)+BYBI]←BUF[2];
MEMORY[LOCATION(PC)+BMAX]←(1 LSH MEMORY[LOCATION(PC)+BYBI])-1;
MEMORY[LOCATION(PC)+LNBY]←BUF[8]-BUF[7]+1;
MEMORY[LOCATION(PC)+PCLN]←BUF[6]-BUF[5]+1;
MEMORY[LOCATION(PC)+WDBY]←36%MEMORY[LOCATION(PC)+BYBI];
MEMORY[LOCATION(PC)+LNWD]←(MEMORY[LOCATION(PC)+LNBY]+MEMORY[LOCATION(PC)+WDBY]-1)%MEMORY[LOCATION(PC)+WDBY];
MEMORY[LOCATION(PC)+LNBYA]←MEMORY[LOCATION(PC)+LNWD]*MEMORY[LOCATION(PC)+WDBY];
MEMORY[LOCATION(PC)+PCWD]←MEMORY[LOCATION(PC)+PCLN]*MEMORY[LOCATION(PC)+LNWD];
MEMORY[LOCATION(PC)+PCBY]←MEMORY[LOCATION(PC)+PCLN]*MEMORY[LOCATION(PC)+LNBY];
MEMORY[LOCATION(PC)+PCBYA]←MEMORY[LOCATION(PC)+PCLN]*MEMORY[LOCATION(PC)+LNBYA];
MEMORY[LOCATION(PC)+WDBI]←MEMORY[LOCATION(PC)+WDBY]*MEMORY[LOCATION(PC)+BYBI];
IF MEMORY[LOCATION(PC)+BYBI]≤0 ∨ MEMORY[LOCATION(PC)+BYBI]>36
∨ MEMORY[LOCATION(PC)+LNBY]≤0 ∨ MEMORY[LOCATION(PC)+PCLN]≤0 ∨ BUF[0]<0 THEN
BEGIN RELEASE(CH); RETURN(-1); END;
PTYP[CH]←-1;
END;
RETURN(CH);
END;
INTERNAL INTEGER PROCEDURE CREPFL(REFERENCE INTEGER PICTURE; STRING FILNAM;
INTEGER MODE(1));
comment write a picture file header on disk and leave file
open for writing. Function returns channel number
on which file is open. Next word written will go into
first data word position in the file. PICTURE must contain
at least the 11 words of header information of the
internal picture representation. If mode is 2, file will
be data compressed;
BEGIN
INTEGER COUNT,BRCHAR,EOF,PICLOC; BOOLEAN FLAG;
INTEGER XPCLN,XPCWD,XPCBY,XPCBYA,XLNWD,XLNBY,XLNBYA,XWDBY,XWDBI,XBYBI;
INTEGER I,L,CH;
INTEGER ARRAY BUF[0:'177];
CH←GETCHAN;
PRSFIL(FILNAM);
EOF←TRUE;
OPEN(CH,DEVPRS,'10,0,19,COUNT,BRCHAR,EOF);
IF ¬EOF THEN ENTER(CH,FILPRS,FLAG);
IF FLAG ∨ EOF THEN
BEGIN
RELEASE(CH);
RETURN(-1);
END
ELSE
BEGIN
L←LOCATION(PICTURE);
BUF[0]←-MODE;
BUF[1]←XBYBI←MEMORY[L+BYBI];
BUF[2]←XLNWD←MEMORY[L+LNWD];
BUF[3]←1; BUF[4]←XPCLN←MEMORY[L+PCLN];
BUF[5]←1; BUF[6]←XLNBY←MEMORY[L+LNBY];
BUF[7]←((-(XPCWD←MEMORY[L+PCWD])) LSH 18) LOR '200;
XWDBY←36%XBYBI;
XLNWD←(XLNBY+XWDBY-1)%XWDBY;
XLNBYA←XLNWD*XWDBY;
ARRYOUT(CH,BUF[0],'200);
PTYP[CH]←MODE; BITN[CH]←'400000000000; PREV[CH]←0; BUFP[CH]←0; BITW[CH]←0;
RETURN(CH);
END;
END;
INTERNAL PROCEDURE PFLIN(INTEGER CH; REFERENCE INTEGER AR; INTEGER NWDS);
comment reads the next NWDS words from the picture file
that has been OPNPFL'd on channel CH;
BEGIN
IF PTYP[CH]=-1∨PTYP[CH]=128 THEN ARRYIN(CH,AR,NWDS) ELSE
IF PTYP[CH]=-2 THEN
BEGIN
INTEGER I;
FOR I←0 STEP 1 UNTIL NWDS-1 DO
BEGIN
IF (BITN[CH]←BITN[CH] LSH -1)=0 THEN
BEGIN BITW[CH]←WORDIN(CH); BITN[CH]←'400000000000; END;
IF (BITW[CH] LAND BITN[CH])≠0 THEN PREV[CH]←WORDIN(CH);
MEMORY[LOCATION(AR)+I]←PREV[CH];
END;
END;
END;
INTERNAL PROCEDURE PFLOUT(INTEGER CH; REFERENCE INTEGER AR; INTEGER NWDS);
comment writes the next NWDS words from the picture file
that has been CREPFL'd on channel CH;
BEGIN
IF PTYP[CH]=1∨PTYP[CH]=128 THEN ARRYOUT(CH,AR,NWDS) ELSE
IF PTYP[CH]=2 THEN
BEGIN
INTEGER I;
FOR I←0 STEP 1 UNTIL NWDS-1 DO
BEGIN
IF MEMORY[LOCATION(AR)+I]≠PREV[CH] THEN
BEGIN
LBU[CH,BUFP[CH]←BUFP[CH]+1]←(PREV[CH]←MEMORY[LOCATION(AR)+I]);
BITW[CH]←BITW[CH] LOR BITN[CH];
END;
IF (BITN[CH]←BITN[CH] LSH -1)=0 THEN
BEGIN
WORDOUT(CH,BITW[CH]); ARRYOUT(CH,LBU[CH,1],BUFP[CH]);
BITN[CH]←'400000000000; BUFP[CH]←0; BITW[CH]←0;
END;
END;
END;
END;
INTERNAL PROCEDURE PFLCLS(INTEGER CH);
BEGIN
IF PTYP[CH]=2 ∧ BITN[CH]≠'400000000000 THEN
BEGIN WORDOUT(CH,BITW[CH]); ARRYOUT(CH,LBU[CH,1],BUFP[CH]); END;
RELEASE(CH);
END;
INTERNAL INTEGER PROCEDURE PFLDIM(STRING FILNAM);
comment returns the size of the picture FILNAM on disk.
used for allocating arrays in preparation for
actually reading them. Returns 0 on failure.;
BEGIN
INTEGER COUNT,BRCHAR,EOF,PICLOC,CH; BOOLEAN FLAG;
INTEGER XPCLN,XPCWD,XPCBY,XPCBYA,XLNWD,XLNBY,XLNBYA,XWDBY,XWDBI,XBYBI;
INTEGER ARRAY BUF[0:'177];
CH←GETCHAN;
PRSFIL(FILNAM);
EOF←TRUE;
OPEN(CH,DEVPRS,'10,19,0,COUNT,BRCHAR,EOF);
IF ¬EOF THEN LOOKUP(CH,FILPRS,FLAG);
IF FLAG ∨ EOF THEN
BEGIN
RELEASE(CH);
RETURN(0);
END
ELSE
BEGIN
ARRYIN(CH,BUF[0],'200); RELEASE(CH);
IF BUF[0]=-1∨BUF[0]=-2∨BUF[0]=128 THEN
BEGIN
XBYBI←BUF[1];
XLNBY←IF BUF[0]=128 THEN BUF[2] ELSE BUF[6]-BUF[5]+1;
XPCLN←IF BUF[0]=128 THEN BUF[4]%BUF[3] ELSE BUF[4]-BUF[3]+1;
XLNWD←IF BUF[0]=128 THEN BUF[3] ELSE BUF[2];
XLNBYA←XLNWD*(36%XBYBI);
XPCWD←XLNWD*XPCLN;
RETURN(13+XPCLN+XLNBYA+XPCWD);
END
ELSE
BEGIN
XBYBI←BUF[2];
XLNBY←BUF[8]-BUF[7]+1;
XPCLN←BUF[6]-BUF[5]+1;
XWDBY←36%XBYBI;
XLNWD←(XLNBY+XWDBY-1)%XWDBY;
XLNBYA←XLNWD*XWDBY;
XPCWD←XPCLN*XLNWD;
XPCBY←XPCLN*XLNBY;
XPCBYA←XPCLN*XLNBYA;
XWDBI←XWDBY*XBYBI;
IF XBYBI≤0 ∨ XBYBI>36 ∨ XLNBY≤0 ∨ XPCLN≤0 ∨ BUF[0]<0 THEN RETURN(0)
ELSE RETURN(13+XPCLN+XLNBYA+XPCWD);
END;
END;
END;
INTERNAL INTEGER PROCEDURE GETPFP(STRING FILNAM; REFERENCE INTEGER PICTURE;
INTEGER Y1,X1,COMY,COMX);
comment read and compress a portion of picture in file FILNAM into PICTURE.
upper left corner of area FILNAM transferred is
[y1,x1]. pixel squares of size COMY by COMX are
summed into each pixel of PICTURE
Returns picture size of success, 0 on failure.;
BEGIN
INTEGER COUNT,BRCHAR,EOF,PICLOC,CH; BOOLEAN FLAG;
INTEGER XPCLN,XPCWD,XPCBY,XPCBYA,XLNWD,XLNBY,XLNBYA,XWDBY,XWDBI,XBYBI;
INTEGER I,L,FW,LW,FB,BPT,II,J,K;
INTEGER ARRAY BUF[0:'177];
CH←GETCHAN;
PRSFIL(FILNAM);
EOF←TRUE;
OPEN(CH,DEVPRS,'10,19,0,COUNT,BRCHAR,EOF);
IF ¬EOF THEN LOOKUP(CH,FILPRS,FLAG);
IF FLAG ∨ EOF THEN
BEGIN
RELEASE(CH);
RETURN(0);
END
ELSE
BEGIN
INTEGER K,KK;
ARRYIN(CH,BUF[0],10);
IF BUF[0]=-1∨BUF[0]=128 THEN
BEGIN
ARRYIN(CH,BUF[10],'200-10);
KK←'200;
comment in case file is MIT pseudo stanford format, and has no pointers;
IF BUF[0]≠128 THEN FOR K←18,17,16,15,10,9,8,7 DO IF BUF[K]≠0 THEN KK←BUF[K];
L←LOCATION(PICTURE);
XBYBI←BUF[1];
XLNBY←IF BUF[0]=128 THEN BUF[2] ELSE BUF[6]-BUF[5]+1;
XPCLN←IF BUF[0]=128 THEN BUF[4]%BUF[3] ELSE BUF[4]-BUF[3]+1;
XWDBY←36%XBYBI;
XLNWD←IF BUF[0]=128 THEN BUF[3] ELSE BUF[2];
XLNBYA←XLNWD*XWDBY;
XPCWD←XPCLN*XLNWD;
XPCBY←XPCLN*XLNBY;
XPCBYA←XPCLN*XLNBYA;
XWDBI←XWDBY*XBYBI;
PICLOC←(KK LAND '777777);
END
ELSE
BEGIN comment if old hand eye format;
L←LOCATION(PICTURE);
XBYBI←BUF[2];
XLNBY←BUF[8]-BUF[7]+1;
XPCLN←BUF[6]-BUF[5]+1;
XWDBY←36%XBYBI;
XLNWD←(XLNBY+XWDBY-1)%XWDBY;
XLNBYA←XLNWD*XWDBY;
XPCWD←XPCLN*XLNWD;
XPCBY←XPCLN*XLNBY;
XPCBYA←XPCLN*XLNBYA;
XWDBI←XWDBY*XBYBI;
IF XBYBI≤0 ∨ XBYBI>36 ∨ XLNBY≤0 ∨ XPCLN≤0 ∨ BUF[0]<0 THEN
BEGIN
RELEASE(CH);
RETURN(0);
END;
PICLOC←10;
END;
FB←X1 MOD XWDBY;
FW←X1 % XWDBY;
LW←(X1+MEMORY[L+LNBY]*COMX-1) % XWDBY;
BEGIN
INTEGER ARRAY BF[0:LW-FW], PIXL[0:MEMORY[L+LNBY]-1];
INTEGER SCAN,SCAD;
PROCEDURE POSN(INTEGER WRD);
BEGIN
INTEGER I; INTEGER ARRAY BU[0:WRD MOD 128];
WRD←WRD+PICLOC;
USETI(CH,WRD%128+1);
ARRYIN(CH,BU[0],WRD MOD 128);
END;
SCAN←MEMORY[L+BMAX]+1; SCAD←(COMX*COMY*2↑XBYBI);
FOR I←0 STEP 1 UNTIL MEMORY[L+PCLN]-1 DO
BEGIN
POSN((I*COMY+Y1)*XLNWD+FW); ARRYIN(CH,BF[0],LW-FW+1);
BPT←POINT(XBYBI,BF[0],FB*XBYBI-1);
FOR K←0 STEP 1 UNTIL MEMORY[L+LNBY]-1 DO
BEGIN
PIXL[K]←ILDB(BPT);
FOR KK←2 STEP 1 UNTIL COMX DO PIXL[K]←PIXL[K]+ILDB(BPT);
END;
FOR II←2 STEP 1 UNTIL COMY DO
BEGIN
INTEGER BPT;
POSN((I*COMY+Y1+II-1)*XLNWD+FW); ARRYIN(CH,BF[0],LW-FW+1);
BPT←POINT(XBYBI,BF[0],FB*XBYBI-1);
FOR K←0 STEP 1 UNTIL MEMORY[L+LNBY]-1 DO
FOR KK←1 STEP 1 UNTIL COMX DO PIXL[K]←PIXL[K]+ILDB(BPT);
END;
FOR J←0 STEP 1 UNTIL MEMORY[L+LNBY]-1 DO
BEGIN
EXTERNAL PROCEDURE PUTEL(REFERENCE INTEGER PIX; INTEGER I,J,VALUE);
PUTEL(MEMORY[L],I,J,(PIXL[J]*SCAN)%SCAD);
END;
END;
END;
END;
END;
internal INTEGER PROCEDURE GETPFD(STRING FILNAM; REFERENCE INTEGER PICTURE);
comment read the header of file FILNAM into area of core whose first
word is PICTURE. Used to get parameters of a picture on disk.
Returns picture size on success, 0 on failure.
Decimal 11 words are returned, PICTURE must be at least this big;
BEGIN
INTEGER COUNT,BRCHAR,EOF,PICLOC; BOOLEAN FLAG;
INTEGER XPCLN,XPCWD,XPCBY,XPCBYA,XLNWD,XLNBY,XLNBYA,XWDBY,XWDBI,XBYBI;
INTEGER I,L,CH;
INTEGER ARRAY BUF[0:'177];
CH←GETCHAN;
PRSFIL(FILNAM);
EOF←TRUE;
OPEN(CH,DEVPRS,'10,19,0,COUNT,BRCHAR,EOF);
IF ¬EOF THEN LOOKUP(CH,FILPRS,FLAG);
IF FLAG ∨ EOF THEN
BEGIN
RELEASE(CH);
RETURN(0);
END
ELSE
BEGIN
ARRYIN(CH,BUF[0],10);
IF BUF[0]=-1∨BUF[0]=-2∨BUF[0]=128 THEN
BEGIN
ARRYIN(CH,BUF[10],'200-10);
L←LOCATION(PICTURE);
MEMORY[L+BYBI]←XBYBI←BUF[1];
MEMORY[L+LNBY]←XLNBY←IF BUF[0]=128 THEN BUF[2] ELSE BUF[6]-BUF[5]+1;
MEMORY[L+PCLN]←XPCLN←IF BUF[0]=128 THEN BUF[4]%BUF[3] ELSE BUF[4]-BUF[3]+1;
MEMORY[L+WDBY]←XWDBY←36%XBYBI;
MEMORY[L+LNWD]←XLNWD←IF BUF[0]=128 THEN BUF[3] ELSE BUF[2];
MEMORY[L+LNBYA]←XLNBYA←XLNWD*XWDBY;
MEMORY[L+PCWD]←XPCWD←XPCLN*XLNWD;
MEMORY[L+PCBY]←XPCBY←XPCLN*XLNBY;
MEMORY[L+PCBYA]←XPCBYA←XPCLN*XLNBYA;
MEMORY[L+WDBI]←XWDBI←XWDBY*XBYBI;
MEMORY[L+BMAX]←(1 LSH XBYBI)-1;
RELEASE(CH);
RETURN(13+XPCLN+XLNBYA+XPCWD);
END
ELSE
BEGIN comment if old hand eye format;
L←LOCATION(PICTURE);
MEMORY[L+BYBI]←XBYBI←BUF[2];
MEMORY[L+LNBY]←XLNBY←BUF[8]-BUF[7]+1;
MEMORY[L+PCLN]←XPCLN←BUF[6]-BUF[5]+1;
MEMORY[L+WDBY]←XWDBY←36%XBYBI;
MEMORY[L+LNWD]←XLNWD←(XLNBY+XWDBY-1)%XWDBY;
MEMORY[L+LNBYA]←XLNBYA←XLNWD*XWDBY;
MEMORY[L+PCWD]←XPCWD←XPCLN*XLNWD;
MEMORY[L+PCBY]←XPCBY←XPCLN*XLNBY;
MEMORY[L+PCBYA]←XPCBYA←XPCLN*XLNBYA;
MEMORY[L+WDBI]←XWDBI←XWDBY*XBYBI;
MEMORY[L+BMAX]←(1 LSH XBYBI)-1;
IF XBYBI≤0 ∨ XBYBI>36 ∨ XLNBY≤0 ∨ XPCLN≤0 ∨ BUF[0]<0 THEN
BEGIN
RELEASE(CH);
RETURN(0);
END;
RELEASE(CH);
RETURN(13+XPCLN+XLNBYA+XPCWD);
END;
END;
END;
internal INTEGER PROCEDURE GETPFL(STRING FILNAM; REFERENCE INTEGER PICTURE);
comment read the picture in FILNAM into area of core whose first
word is PICTURE. PFLDIM(FILNAM) words are needed.
Returns picture size on success, 0 on failure;
BEGIN
INTEGER COUNT,BRCHAR,EOF,PICLOC; BOOLEAN FLAG;
INTEGER XPCLN,XPCWD,XPCBY,XPCBYA,XLNWD,XLNBY,XLNBYA,XWDBY,XWDBI,XBYBI;
INTEGER I,L,CH;
INTEGER ARRAY BUF[0:'177];
CH←GETCHAN;
PRSFIL(FILNAM);
EOF←TRUE;
OPEN(CH,DEVPRS,'10,19,0,COUNT,BRCHAR,EOF);
IF ¬EOF THEN LOOKUP(CH,FILPRS,FLAG);
IF FLAG ∨ EOF THEN
BEGIN
RELEASE(CH);
RETURN(0);
END
ELSE
BEGIN
INTEGER K,KK;
ARRYIN(CH,BUF[0],10);
IF BUF[0]=-1∨BUF[0]=-2∨BUF[0]=128 THEN
BEGIN
ARRYIN(CH,BUF[10],'200-10);
KK←'200;
comment for MIT pseudo stanford format, which has no pointers;
IF BUF[0]≠128 THEN FOR K←18,17,16,15,10,9,8,7 DO IF BUF[K]≠0 THEN KK←BUF[K];
L←LOCATION(PICTURE);
MEMORY[L+BYBI]←XBYBI←BUF[1];
MEMORY[L+LNBY]←XLNBY←IF BUF[0]=128 THEN BUF[2] ELSE BUF[6]-BUF[5]+1;
MEMORY[L+PCLN]←XPCLN←IF BUF[0]=128 THEN BUF[4]%BUF[3] ELSE BUF[4]-BUF[3]+1;
MEMORY[L+LNWD]←XLNWD←IF BUF[0]=128 THEN BUF[3] ELSE BUF[2];
MEMORY[L+WDBY]←XWDBY←36%XBYBI;
MEMORY[L+LNBYA]←XLNBYA←XLNWD*XWDBY;
MEMORY[L+PCWD]←XPCWD←XPCLN*XLNWD;
MEMORY[L+PCBY]←XPCBY←XPCLN*XLNBY;
MEMORY[L+PCBYA]←XPCBYA←XPCLN*XLNBYA;
MEMORY[L+WDBI]←XWDBI←XWDBY*XBYBI;
MEMORY[L+BMAX]←(1 LSH XBYBI)-1;
MEMORY[L+BPTAB]←13+XPCLN+L;
MAKTAB(PICTURE);
PICLOC←(KK LAND '777777) - '200;
IF PICLOC<0 THEN BEGIN USETI(CH,1); PICLOC←PICLOC+'200; END;
FOR I←1 STEP 1 UNTIL PICLOC DO WORDIN(CH);
IF BUF[0]=-1∨BUF[0]=128 THEN
ARRYIN(CH,MEMORY[L+13+XPCLN+XLNBYA],XPCWD) ELSE
IF BUF[0]=-2 THEN
BEGIN comment if a compressed picture;
INTEGER PREV,BITW,BITN;
BITN←1; PREV←0;
L←L+13+XPCLN+XLNBYA;
FOR I←L STEP 1 UNTIL L+XPCWD-1 DO
BEGIN
IF (BITN←BITN LSH -1)=0 THEN
BEGIN BITW←WORDIN(CH); BITN←'400000000000; END;
IF (BITW LAND BITN)≠0 THEN PREV←WORDIN(CH);
MEMORY[I]←PREV;
END;
END;
RELEASE(CH);
RETURN(13+XPCLN+XLNBYA+XPCWD);
END
ELSE
BEGIN comment if old hand eye format;
L←LOCATION(PICTURE);
MEMORY[L+BYBI]←XBYBI←BUF[2];
MEMORY[L+LNBY]←XLNBY←BUF[8]-BUF[7]+1;
MEMORY[L+PCLN]←XPCLN←BUF[6]-BUF[5]+1;
MEMORY[L+WDBY]←XWDBY←36%XBYBI;
MEMORY[L+LNWD]←XLNWD←(XLNBY+XWDBY-1)%XWDBY;
MEMORY[L+LNBYA]←XLNBYA←XLNWD*XWDBY;
MEMORY[L+PCWD]←XPCWD←XPCLN*XLNWD;
MEMORY[L+PCBY]←XPCBY←XPCLN*XLNBY;
MEMORY[L+PCBYA]←XPCBYA←XPCLN*XLNBYA;
MEMORY[L+WDBI]←XWDBI←XWDBY*XBYBI;
MEMORY[L+BMAX]←(1 LSH XBYBI)-1;
MEMORY[L+BPTAB]←13+XPCLN+L;
MAKTAB(PICTURE);
IF XBYBI≤0 ∨ XBYBI>36 ∨ XLNBY≤0 ∨ XPCLN≤0 ∨ BUF[0]<0 THEN
BEGIN
RELEASE(CH);
RETURN(0);
END;
ARRYIN(CH,MEMORY[L+13+XPCLN+XLNBYA],XPCWD);
RELEASE(CH);
RETURN(13+XPCLN+XLNBYA+XPCWD);
END;
END;
END;
internal INTEGER PROCEDURE PIXDIM(INTEGER HEIGHT,WIDTH,BITS);
comment returns the size of the array needed to hold a hypothetical
picture HEIGHT scanlines by WIDTH pixels per scanline
by BITS bits per pixel.;
BEGIN
INTEGER XPCLN,XPCWD,XPCBY,XPCBYA,XLNWD,XLNBY,XLNBYA,XWDBY,XWDBI,XBYBI;
INTEGER L;
XBYBI←BITS;
XLNBY←WIDTH;
XPCLN←HEIGHT;
XWDBY←36%XBYBI;
XLNWD←(XLNBY+XWDBY-1)%XWDBY;
XLNBYA←XLNWD*XWDBY;
XPCWD←XPCLN*XLNWD;
RETURN(13+XPCLN+XLNBYA+XPCWD);
END;
internal INTEGER PROCEDURE MAKPIX(INTEGER HEIGHT,WIDTH,BITS; REFERENCE INTEGER PICTURE);
comment actually creates an empty picture HEIGHT by WIDTH by BITS in
the area of core beginning with PICTURE. Returns its size.;
BEGIN
INTEGER XPCLN,XPCWD,XPCBY,XPCBYA,XLNWD,XLNBY,XLNBYA,XWDBY,XWDBI,XBYBI;
INTEGER I,L;
L←LOCATION(PICTURE);
MEMORY[L+BYBI]←XBYBI←BITS;
MEMORY[L+LNBY]←XLNBY←WIDTH;
MEMORY[L+PCLN]←XPCLN←HEIGHT;
MEMORY[L+WDBY]←XWDBY←36%XBYBI;
MEMORY[L+LNWD]←XLNWD←(XLNBY+XWDBY-1)%XWDBY;
MEMORY[L+LNBYA]←XLNBYA←XLNWD*XWDBY;
MEMORY[L+PCWD]←XPCWD←XPCLN*XLNWD;
MEMORY[L+PCBY]←XPCBY←XPCLN*XLNBY;
MEMORY[L+PCBYA]←XPCBYA←XPCLN*XLNBYA;
MEMORY[L+WDBI]←XWDBI←XWDBY*XBYBI;
MEMORY[L+BMAX]←(1 LSH XBYBI)-1;
MEMORY[L+BPTAB]←13+XPCLN+L;
MAKTAB(PICTURE);
RETURN(13+XPCLN+XLNBYA+XPCWD);
END;
internal INTEGER PROCEDURE MAKDIM(INTEGER HEIGHT,WIDTH,BITS; REFERENCE INTEGER PICTURE);
comment creates an internal picture header for HEIGHT by WIDTH by BITS
in the first 11 words of PICTURE. does not touch line and
byte pointer areas;
BEGIN
INTEGER XPCLN,XPCWD,XPCBY,XPCBYA,XLNWD,XLNBY,XLNBYA,XWDBY,XWDBI,XBYBI;
INTEGER I,L;
L←LOCATION(PICTURE);
MEMORY[L+BYBI]←XBYBI←BITS;
MEMORY[L+LNBY]←XLNBY←WIDTH;
MEMORY[L+PCLN]←XPCLN←HEIGHT;
MEMORY[L+WDBY]←XWDBY←36%XBYBI;
MEMORY[L+LNWD]←XLNWD←(XLNBY+XWDBY-1)%XWDBY;
MEMORY[L+LNBYA]←XLNBYA←XLNWD*XWDBY;
MEMORY[L+PCWD]←XPCWD←XPCLN*XLNWD;
MEMORY[L+PCBY]←XPCBY←XPCLN*XLNBY;
MEMORY[L+PCBYA]←XPCBYA←XPCLN*XLNBYA;
MEMORY[L+WDBI]←XWDBI←XWDBY*XBYBI;
MEMORY[L+BMAX]←(1 LSH XBYBI)-1;
RETURN(13+XPCLN+XLNBYA+XPCWD);
END;
internal INTEGER PROCEDURE PUTPFL(REFERENCE INTEGER PICTURE; STRING FILNAM;
INTEGER MODE(1));
comment write out the picture in the core area starting with
PICTURE, creating a file called FILNAM. Returns
the size of the original file on success, else 0.
If MODE is 2, picture will be written out in
data-compressed form;
BEGIN
INTEGER COUNT,BRCHAR,EOF,PICLOC; BOOLEAN FLAG;
INTEGER XPCLN,XPCWD,XPCBY,XPCBYA,XLNWD,XLNBY,XLNBYA,XWDBY,XWDBI,XBYBI;
INTEGER I,L,CH;
INTEGER ARRAY BUF[0:'177];
CH←GETCHAN;
PRSFIL(FILNAM);
EOF←TRUE;
OPEN(CH,DEVPRS,'10,0,19,COUNT,BRCHAR,EOF);
IF ¬EOF THEN ENTER(CH,FILPRS,FLAG);
IF FLAG ∨ EOF THEN
BEGIN
RELEASE(CH);
RETURN(0);
END
ELSE
BEGIN
L←LOCATION(PICTURE);
BUF[0]←-MODE;
BUF[1]←XBYBI←MEMORY[L+BYBI];
BUF[2]←XLNWD←MEMORY[L+LNWD];
BUF[3]←1; BUF[4]←XPCLN←MEMORY[L+PCLN];
BUF[5]←1; BUF[6]←XLNBY←MEMORY[L+LNBY];
BUF[7]←((-(XPCWD←MEMORY[L+PCWD])) LSH 18) LOR '200;
XWDBY←36%XBYBI;
XLNWD←(XLNBY+XWDBY-1)%XWDBY;
XLNBYA←XLNWD*XWDBY;
ARRYOUT(CH,BUF[0],'200);
IF MODE=1 THEN ARRYOUT(CH,MEMORY[L+13+XPCLN+XLNBYA],XPCWD) ELSE
IF MODE=2 THEN
BEGIN comment Data compressed output;
INTEGER BITN,PREV,BUFP,BITW;
BITN←'400000000000; PREV←0; BUFP←0; BITW←0;
L←L+13+XPCLN+XLNBYA;
FOR I←L STEP 1 UNTIL L+XPCWD-1 DO
BEGIN
IF MEMORY[I]≠PREV THEN
BEGIN
BUF[BUFP←BUFP+1]←(PREV←MEMORY[I]);
BITW←BITW LOR BITN;
END;
IF (BITN←BITN LSH -1)=0 THEN
BEGIN
BUF[0]←BITW; ARRYOUT(CH,BUF[0],BUFP+1);
BITN←'400000000000; BUFP←0; BITW←0;
END;
END;
IF BITN≠'400000000000 THEN BEGIN BUF[0]←BITW; ARRYOUT(CH,BUF[0],BUFP+1); END;
END;
RELEASE(CH);
RETURN(13+XPCLN+XLNBYA+XPCWD);
END;
END;
internal INTEGER PROCEDURE diminterest(REFERENCE INTEGER PICTURE; INTEGER IW);
BEGIN
INTEGER HIG,WID,BITS;
HIG←MEMORY[LOCATION(PICTURE)+PCLN];
WID←MEMORY[LOCATION(PICTURE)+LNBY];
BITS←MEMORY[LOCATION(PICTURE)+BYBI];
RETURN(PIXDIM((HIG-1)%IW,(WID-1)%IW,10));
END;
internal PROCEDURE INTEREST(REFERENCE INTEGER PICTURE; INTEGER IW;
REFERENCE INTEGER RESULT);
BEGIN
INTEGER HIG,WID,BITS,IAV,I,J,IWW,BYMAX;
EXTERNAL PROCEDURE GETPAR(REFERENCE INTEGER ARY, PICT);
HIG←MEMORY[LOCATION(PICTURE)+PCLN];
WID←MEMORY[LOCATION(PICTURE)+LNBY];
BITS←MEMORY[LOCATION(PICTURE)+BYBI];
BEGIN
INTEGER ARRAY INTER[-2:(HIG-1)%IW-1,0:(WID-1)%IW-1];
IAV←INTOP(PICTURE,IW,INTER[0,0]);
IWW←IW*IW;
BYMAX←2↑BITS-1;
FOR I←(HIG-1)%IW-1 STEP -1 UNTIL 0 DO
FOR J←(WID-1)%IW-1 STEP -1 UNTIL 0 DO
INTER[I,J]←8*SQRT(INTER[I,J]/IWW) MIN BYMAX;
MAKPIX((HIG-1)%IW,(WID-1)%IW,BITS,RESULT);
GETPAR(INTER[0,0],RESULT);
END;
END;
INTERNAL PROCEDURE ENHANCE(REFERENCE INTEGER PIC);
BEGIN
INTEGER INTEG,I,TOT,BITS,SAMPS;
BITS←MEMORY[LOCATION(PIC)+BYBI];
SAMPS←2↑BITS;
BEGIN
INTEGER ARRAY GREYS[0:SAMPS-1];
HISTOG(PIC,GREYS[0]);
TOT←0;
FOR I←0 STEP 1 UNTIL SAMPS-1 DO TOT←TOT+GREYS[I];
INTEG←0;
FOR I←0 STEP 1 UNTIL SAMPS-1 DO
BEGIN
INTEG←INTEG+GREYS[I];
GREYS[I]←(SAMPS-1)*INTEG/TOT;
END;
PERBIT(PIC,GREYS[0]);
END;
END;
INTERNAL PROCEDURE SYNCHRONIZE(REFERENCE INTEGER PIC);
BEGIN
INTEGER I,J,K,WINPOS,HIG;
REAL WINVAL,TRIALVAL;
HIG←MEMORY[LOCATION(PIC)+PCLN];
BEGIN
INTEGER ARRAY ROWSM[0:HIG-1];
DEFINE DK=".6";
ROWSUD(PIC,ROWSM[0]);
WINPOS←HIG-1;
WINVAL←ROWSM[HIG-1];
FOR I←0 STEP 1 UNTIL HIG-1 DO WINVAL←WINVAL*DK + ROWSM[I]*(1-DK);
TRIALVAL←WINVAL;
FOR J←0 STEP 1 UNTIL HIG-1 DO
BEGIN
TRIALVAL←TRIALVAL*DK + ROWSM[J]*(1-DK);
IF TRIALVAL≤WINVAL THEN
BEGIN
WINVAL←TRIALVAL;
WINPOS←J;
END;
END;
IF WINPOS<HIG-1 THEN
BEGIN
INTEGER BODY,BODYSIZ;
INTEGER ARRAY COPY[0:BODYSIZ←MEMORY[LOCATION(PIC)+PCWD]];
BODY←MEMORY[LOCATION(PIC)+LINTAB];
WINPOS←(WINPOS+1)*MEMORY[LOCATION(PIC)+LNWD];
ARRBLT(COPY[0],MEMORY[BODY+WINPOS],BODYSIZ-WINPOS);
ARRBLT(COPY[BODYSIZ-WINPOS],MEMORY[BODY],WINPOS);
ARRBLT(MEMORY[BODY],COPY[0],BODYSIZ);
END;
END;
END;
Comment All gone now...just like the digitizer;
IFC FALSE THENC
INTERNAL INTEGER PROCEDURE CAMPIX(INTEGER CAMRA,YEDGE,XEDGE;
REFERENCE INTEGER PICTURE;
INTEGER SUMS(1),BCLIP(7),TCLIP(0),NTRY(10));
comment read a picture from camera CAMRA of size defined by array PICTURE
the area of core beginning with PICTURE. Upper left hand
corner is at PICX,PICY. SUMS and CLPINC are averaging params.;
BEGIN
EXTERNAL INTEGER PROCEDURE TVSNAP(INTEGER CAM,YEDG,XEDG;
REFERENCE INTEGER PIC;
INTEGER BCLIP,TCLIP,NTRY);
EXTERNAL INTEGER PROCEDURE TVRAW(INTEGER CAM,YEDG,XEDG;
REFERENCE INTEGER PIC;
INTEGER BCLIP,TCLIP,NTRY);
EXTERNAL PROCEDURE WIPE(REFERENCE INTEGER PICTURE; INTEGER VALUE);
EXTERNAL PROCEDURE TVBTMX(REFERENCE INTEGER PIC4,PICN,XFRM; INTEGER TOPV(7));
EXTERNAL PROCEDURE PICADD(REFERENCE INTEGER PICTURE,PICSUM);
EXTERNAL PROCEDURE SHRINK(REFERENCE INTEGER PIC1,PIC2);
EXTERNAL PROCEDURE PICSH(REFERENCE INTEGER PIC1,PIC2; INTEGER DIV);
INTEGER XPCLN,XLNBY,XBYBI;
INTEGER L,CAM,DW,ERS,I,J,K,NDEL;
PRELOAD_WITH '12,'13,'11,'10,'15,'14,'16,'17,'5,'4,'6,'7,'2,'3,'1,'0;
OWN INTEGER ARRAY GREY[0:15];
IF CAMRA>'40 THEN CAMRA←CAMRA LAND '67;
IF CAMRA='42∨CAMRA='41 THEN CAM←CAMRA LAND 3 ELSE
BEGIN
INTEGER I,J;
I←'401400000000 LOR LOCATION(J);
J←IF CAMRA≥'40 THEN CAMRA LAND 7 ELSE 1 LSH (35-CAMRA);
START_CODE
MOVE 1,I;
CALLI 1,'400070; COMMENT VDSMAP;
JUMP 0,0;
END;
CAM←3;
END;
L←LOCATION(PICTURE);
XPCLN←MEMORY[L+PCLN];
XLNBY←MEMORY[L+LNBY];
XBYBI←MEMORY[L+BYBI];
NDEL←0; SUMS←SUMS MAX 1;
BEGIN
INTEGER ARRAY T1[0:IF XBYBI≠4 THEN PIXDIM(XPCLN,XLNBY,4) ELSE 0],
T[0:IF SUMS>1 THEN PIXDIM(XPCLN,XLNBY,12) ELSE 0];
IF XBYBI≠4 THEN MAKPIX(XPCLN,XLNBY,4,T1[0]);
IF SUMS>1 THEN
BEGIN
MAKPIX(XPCLN,XLNBY,12,T[0]);
WIPE(T[0],0);
END;
ERS←0;
FOR K←1 STEP 1 UNTIL SUMS DO
BEGIN
IF XBYBI>4 THEN
BEGIN
INTEGER CLPINC,TC,BC,CLPSTP;
INTEGER MXBY;
MXBY←2↑XBYBI-1;
CLPINC←(BCLIP-TCLIP+1)*15/MXBY;
CLPINC←((CLPINC MAX 1) MIN 7);
CLPSTP←CLPINC%2 MAX 1;
WIPE(PICTURE,-1);
TC←TCLIP;
DO
BEGIN
INTEGER ARRAY XFRM[0:15];
REAL TM,BM;
BC←TC+CLPINC-1;
TM←(BCLIP+1-TC)*MXBY/(BCLIP-TCLIP+1);
BM←(BCLIP-BC)*MXBY/(BCLIP-TCLIP+1);
FOR I←0 STEP 1 UNTIL 15 DO
XFRM[I]←
((2*GREY[I]*(TM-BM)+TM+29*BM)/30 MAX 0) MIN MXBY;
DW←TVRAW(CAM,YEDGE,XEDGE,T1[0],BC,TC,NDEL←NDEL+NTRY);
IF DW≥0 THEN
BEGIN
TVBTMX(T1[0],PICTURE,XFRM[0],7);
TC←TC+CLPSTP;
END;
END
UNTIL BC≥BCLIP∨DW<0;
ERS←ERS+DW;
END
ELSE
IF XBYBI=4 THEN
DW←TVSNAP(CAM,YEDGE,XEDGE,PICTURE,BCLIP,TCLIP,NDEL←NDEL+NTRY)
ELSE
IF XBYBI<4 THEN
DW←TVSNAP(CAM,YEDGE,XEDGE,T1[0],BCLIP,TCLIP,NDEL←NDEL+NTRY);
IF DW≥0 THEN
BEGIN
IF SUMS>1 THEN PICADD(PICTURE,T[0]);
ERS←ERS+DW;
END
ELSE
BEGIN
K←SUMS;
ERS←-1;
END;
END;
IF ERS≥0 THEN
IF SUMS>1 THEN PICSH(T[0],PICTURE,SUMS) ELSE
IF XBYBI<4 THEN SHRINK(T1[0],PICTURE);
END;
RETURN(ERS);
END;
INTERNAL INTEGER PROCEDURE CLPADJ(INTEGER CAMRA;
REFERENCE INTEGER BCLIP,TCLIP;
REAL LIMB(.01),LIMT(.01));
BEGIN
INTEGER ARRAY T[0:PIXDIM(200,200,4)];
INTEGER NRT;
MAKPIX(200,200,4,T[0]);
NRT←CAMPIX(CAMRA,20,20,T[0],1,7,0,10);
IF NRT≥0 THEN
BEGIN
INTEGER ARRAY A[0:15],TT,TB[0:7]; INTEGER I,S,P;
HISTOG(T[0],A[0]);
S←0; FOR I←0 STEP 1 UNTIL 7 DO S←S+(TB[I]←TT[I]←A[15-2*I]+A[14-2*I]);
LIMB←LIMB*S; LIMT←LIMT*S;
FOR I←1 STEP 1 UNTIL 7 DO TT[I]←TT[I]+TT[I-1];
FOR I←6 STEP -1 UNTIL 0 DO TB[I]←TB[I]+TB[I+1];
TCLIP←0; BCLIP←7;
FOR I←0 STEP 1 UNTIL 7 DO IF ABS(TT[I]-LIMT)<ABS(TT[TCLIP]-LIMT) THEN TCLIP←I;
FOR I←7 STEP -1 UNTIL TCLIP DO IF ABS(TB[I]-LIMB)<ABS(TB[BCLIP]-LIMB)
THEN BCLIP←I;
END;
RETURN(NRT);
END;
Sorry about that Hans...
ENDC
end